#include <cstring>
#include <iostream>

using namespace std;

class Student {
public:
    Student() {
        cout << "调用了 Student 的无参构造函数" << endl;
    }

    ~Student() {
        cout << "调用了 Student 的析构函数" << endl;
    }

    Student(const Student &) {
        cout << "调用了 Student 的拷贝构造函数" << endl;
    }
};

void test01() {
    // 用 C 语言的方式申请堆内存空间, 创建 Student 类的内存地址
    // 不会调用 Student 类的构造函数, 也不会调用 Student 类的析构函数
    Student *student = static_cast<Student *>(malloc(sizeof(Student)));

    free(student);

    // C++ 使用 C 语言的方式管理对象的缺点:
    // 1. 程序必须确定创建对象的长度
    // 2. malloc 返回(void *)指针, C++ 不允许(void *)赋值给其他任何指针, 必须强转
    // 3. malloc 可能申请内存失败, 所以必须判断返回值来确保内存分配成功
    // 4. 无法和类的构造函数和析构函数关联, 增加代码的维护成本
}

void test02() {
    // 使用 new 创建对象会调用类对应的构造函数
    Student *student = new Student();

    // 使用 delete 销毁对象会调用类的对应的析构函数
    delete student;

    cout << endl;
}


void test03() {
    // 使用 new 创建基础类型的数组
    int *int_array = new int[10];

    for (int i = 0; i < 10; ++i) {
        int_array[i] = i;
    }

    char *char_array = new char[1024];
    memset(char_array, 0, sizeof(char_array));
    strcpy(char_array, "BlueYui");

    cout << char_array << endl << endl;

    // 注意事项: new 时有中括号的话, delete 同时也要有中括号
    delete[] int_array, char_array;

    // 使用 new 创建非基础类型的数组
    Student *student_array = new Student[10]();

    delete[] student_array;

    cout << endl;
}

int main() {
    test01();

    test02();

    test03();

    return 0;
}